#include <iostream>
using namespace std;
// 参照之前的单列对象的自动释放资源
// 想到可以利用栈对象的生命周期的特点
// 去管理资源，这样可以实现资源的自动释放

class SafeFile{
public:
    // 1.在构造函数中托管资源
    SafeFile(FILE * fp)
    :_fp(fp)
    {
        cout << "SafeFile(FILE *)" << endl;
    }

    // 在析构函数中释放资源
    ~SafeFile(){
        cout << "~SafeFile()" <<endl;
        if(_fp){
            fclose(_fp);
            cout << "fclose(_fp)" << endl;
        }
    }

    // 提供一些访问资源的方法
    void write(const string & msg){
        // 往文件里面写入内容
        fwrite(msg.c_str(),1,msg.size(),_fp);
    }

private:
    // 私有化赋值运算符和拷贝构造函数
    // 文件里面没有这个说法不需要这一步
    FILE * _fp;
};

#if 0
        1. 在构造函数中初始化资源
            （在构造函数中托管资源）
        2. 在析构函数中释放资源
        3. 一般不允许拷贝和赋值运算符使用
                （对象语义的使用）
        4. 提供若干的访问资源的方法（读文件）
#endif

void test(){
    SafeFile fp(fopen("wd.txt","a+"));
    string str = "hello,wangdao";
    fp.write(str);
}

int main(int atgc, char * argv[])
{
    test();
    return 0;
}

